package com.yzion.widgetlib;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import com.blankj.utilcode.util.ColorUtils;
import com.yzion.widgetlib.R;

import java.util.ArrayList;
import java.util.List;

/**
 * 涟漪水波纹特效
 */
public class WaveView extends View {
    private Paint paint;
    private boolean isStarting = false;
    private List<Integer> alphaList = new ArrayList<>();
    private List<Integer> startWidthList = new ArrayList<>();

    public WaveView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public WaveView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public WaveView(Context context) {
        super(context);
        init();
    }

    private void init() {
        paint = new Paint();
        // 设置波纹的颜色
        paint.setColor(ColorUtils.getColor(R.color.colorAccent));
        // 圆心的不透明度
        alphaList.add(255);
        startWidthList.add(0);
    }

    /**
     * 设置波纹颜色
     *
     * @param alpha 透明度
     * @param red   红色
     * @param green 绿色
     * @param blue  蓝色
     */
    public void setWaveColor(int alpha, int red, int green, int blue) {
        if (paint != null) {
            paint.setColor(Color.argb(alpha, red, green, blue));
        }
        invalidate();
    }

    int maxWidth = 600;

    public void setWaveMaxWidth(int width) {
        maxWidth = width;
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 背景颜色：完全透明
        setBackgroundColor(Color.TRANSPARENT);
        int maxWidth = this.maxWidth;
        // 依次绘制 同心圆
        for (int i = 0; i < alphaList.size(); i++) {
            int alpha = alphaList.get(i);
            // 圆半径
            int startWidth = startWidthList.get(i);
            paint.setAlpha(alpha);
            // 这个半径决定你想要多大的扩散面积
            canvas.drawCircle((float) getWidth() / 2, (float) getHeight() / 2, startWidth + 50, paint);
            // 同心圆扩散
            if (isStarting && alpha > 0 && startWidth < maxWidth) {
                alphaList.set(i, (alpha - 1));
                startWidthList.set(i, startWidth + 2);
            }
        }
        if (isStarting && startWidthList.get(startWidthList.size() - 1) == maxWidth / 3) {
            alphaList.add(255);
            startWidthList.add(0);
        }
        // 同心圆数量达到10个，删除最外层圆
        if (isStarting && startWidthList.size() == 10) {
            startWidthList.remove(0);
            alphaList.remove(0);
        }
        // 刷新界面
        invalidate();
    }

    // 执行动画
    public void start() {
        isStarting = true;
    }

    // 停止动画
    public void stop() {
        isStarting = false;
    }

    // 判断是都在不在执行
    public boolean isStarting() {
        return isStarting;
    }
}
